package com.jsh.erp.web.vo;

import lombok.Builder;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.domain.Page;

import java.util.function.Function;

@Data
@Builder
public class BaseResponseInfo<T> {
    public static final int CODE_SUCCESS = 200;
    public static final int CODE_FAIL = 500;

    public int code;
    public T data;
    private String message;

    public BaseResponseInfo() {
        code = CODE_SUCCESS;
        data = null;
    }

    public BaseResponseInfo(int code, T data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 构建成功的result
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> BaseResponseInfo<T> success(T data) {
        return new BaseResponseInfo<>(CODE_SUCCESS, data, null);
    }

    /**
     * 构建成功的result
     *
     * @param data
     * @param message
     * @param <T>
     * @return
     */
    public static <T> BaseResponseInfo<T> success(T data, String message) {
        return new BaseResponseInfo<T>(0, data, message);
    }

    /**
     * 构建 失败的result
     *
     * @param <T>
     * @return
     */
    public static <T> BaseResponseInfo<T> fail() {
        return new BaseResponseInfo<>(CODE_FAIL, null, null);
    }

    /**
     * 构建 失败的result
     *
     * @param message
     * @param <T>
     * @return
     */
    public static <T> BaseResponseInfo<T> fail(String message) {
        return new BaseResponseInfo<>(CODE_FAIL, null, message);
    }

    /**
     * 构建 失败的result
     *
     * @param data
     * @param message
     * @param <T>
     * @return
     */
    public static <T> BaseResponseInfo<T> fail(T data, String message) {
        return new BaseResponseInfo<>(CODE_FAIL, data, message);
    }

    /**
     * 构建 page的vo
     *
     * @param data
     * @param message
     * @param <T>
     * @return
     */
    @Deprecated
    public static <T> BaseResponseInfo<PageVO<T>> page(PageVO<T> data, String message) {
        return new BaseResponseInfo<>(CODE_SUCCESS, data, message);
    }

//    /**
//     * 构建page的vo
//     *
//     * @param data
//     * @param converter 转换器
//     * @param <S>       page原来的类型
//     * @param <T>       page需要转换的类型
//     * @return
//     */
//    @Deprecated
//    public static <S, T> BaseResponseInfo<PageVO<T>> page(PageVO<S> data, Converter<S, T> converter) {
//        return BaseResponseInfo.page(data, converter, null);
//    }

//    /**
//     * 构建page的vo
//     * spring boot 2.0以后使用
//     *
//     * @param data
//     * @param converter 转换器
//     * @param <S>       page原来的类型
//     * @param <T>       page需要转换的类型
//     * @return
//     */
//    public static <S, T> BaseResponseInfo<PageVO<T>> page(PageVO<S> data, Function<S, T> converter) {
//        return BaseResponseInfo.page(data, converter, null);
//    }

//    /**
//     * 构建page的vo
//     * spring boot 2.0以后使用
//     *
//     * @param data
//     * @param converter 转换器
//     * @param message
//     * @param <S>       page原来的类型
//     * @param <T>       page需要转换的类型
//     * @return
//     */
//    public static <S, T> BaseResponseInfo<PageVO<T>> page(PageVO<S> data, final Function<S, T> converter, String message) {
//        Page<T> page = null;
//        if (data != null) {
//            page = data.map((s) -> converter.apply(s));
//        }
//        PageVO pageVO = new PageVO();
//        BeanUtils.copyProperties(page, pageVO);
//        return new BaseResponseInfo<PageVO<T>>(CODE_SUCCESS, pageVO, message);
//    }

//    /**
//     * 构建page的vo
//     * spring 1.5.9
//     *
//     * @param data
//     * @param converter 转换器
//     * @param message
//     * @param <S>       page原来的类型
//     * @param <T>       page需要转换的类型
//     * @return
//     */
//    @Deprecated
//    public static <S, T> BaseResponseInfo<PageVO<T>> page(PageVO<S> data, final Converter<S, T> converter, String message) {
//        Page<T> page = null;
//
//        if (data != null) {
//            page = data.map((s) -> converter.convert(s));
//        }
//        PageVO pageVO = new PageVO();
//        BeanUtils.copyProperties(page, pageVO);
//        return new BaseResponseInfo<PageVO<T>>(CODE_SUCCESS, pageVO, message);
//    }

}
